def debug(msg, first="a")
  sq = (first.."z").to_a;
  puts(msg);
  args = yield;
  args.each_with_index{|obj, i| print("#{sq[i]} = #{obj.inspect}; ");}
  puts "\n\n";
end

a = "bird"
b = "dog"
c = "cat"
d = ["bat", "pig"]
def e; return "cow", "horse"; end
def f; return ["duck", "fish"]; end
def g; ["lion", "bull"]; end

debug "Actual" do 
  [a, b, c, d, e, f, g]
end

debug "Normal Assignment", "h" do
  h, i = d;
  j, k = *d;
  [h, i, j, k]
end

debug "Assigment With Method Results", "l" do
  l, m = e;
  n, o = *e;
  p, q = f;
  r, s = *f;
  t, u = g;
  v, w = *g;
  [l, m, n, o, p, q, r, s, t, u, v, w]
end

puts "There is no difference using an * before an array and an array on assigments and with return"

  
  
  
  
  
  